package com.li.o2oSystem.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.li.o2oSystem.dao.ProductDao;
import com.li.o2oSystem.dao.ProductImgDao;
import com.li.o2oSystem.dto.ImageHolder;
import com.li.o2oSystem.dto.ProductExecution;
import com.li.o2oSystem.entity.Product;
import com.li.o2oSystem.entity.ProductImg;
import com.li.o2oSystem.enums.ProductStateEnum;
import com.li.o2oSystem.exceptions.ProductOperationException;
import com.li.o2oSystem.exceptions.ShopOperationException;
import com.li.o2oSystem.service.ProductService;
import com.li.o2oSystem.util.ImageUtil;
import com.li.o2oSystem.util.PageCalculator;
import com.li.o2oSystem.util.PathUtil;
@Service
public class ProductServiceImpl implements ProductService {
	@Autowired
	private ProductDao productDao;
	@Autowired ProductImgDao productImgDao;
	
	/**
	 * 添加商品
	 * 1.处理缩略图，获取缩略图相对路径，并赋值个Product
	 * 2.往tb_product写入商品信息，获取ProductId
	 * 3.结合productId批量处理商品详情图
	 * 4.将商品详情图里列表批量插入tb_product_img表中
	 */
	@Transactional
	public ProductExecution addProduct(Product product, ImageHolder thumbnail, List<ImageHolder> productImgHolderList)
			throws ProductOperationException {
		//空值判断
		if(product != null && product.getShop() != null && product.getShop().getShopId() != null){
		//给商品设置上默认属性
			product.setCreateTime(new Date());
			product.setLastEditTime(new Date());
			//默认为上架状态
			product.setEnableStatus(1);
			//若商品缩略图不为空，则添加
			if(thumbnail != null){
				addThumbnail(product,thumbnail);
			}
			try{
				//创建商品信息
				int effectNum = productDao.insertProduct(product);
				if(effectNum <= 0){// 如果影响行数小于等于0
					throw new ProductOperationException("添加商品失败！");
				}
			}catch(Exception e){
				throw new ProductOperationException("添加商品异常："+e.getMessage());
			}
			//若商品详情图不为空
			if(productImgHolderList != null && productImgHolderList.size() > 0){
				addProductImgList(product,productImgHolderList);
			}
			return new ProductExecution(ProductStateEnum.SUCCESS, product);
		}
		else{
			//传参为空，则返回空值错误
			return new ProductExecution(ProductStateEnum.EMPTY);
		}
	}
	/**
	 * 添加缩略图
	 * @param product
	 * @param thumbnail
	 */
	private void addThumbnail(Product product, ImageHolder thumbnail) {
		String dest = PathUtil.getShopImagePath(product.getShop().getShopId());
		String thumbnailAddr = ImageUtil.generateThumbnails(thumbnail, dest);
		product.setImgAddr(thumbnailAddr);
	}
	/**
	 * 批量添加图片
	 * @param product
	 * @param productImgHolderList
	 */
	private void addProductImgList(Product product, List<ImageHolder> productImgHolderList) {
		//获取图片存储路径，这里直接存放到相应店铺文件夹底下
		String dest = PathUtil.getShopImagePath(product.getShop().getShopId());
		List<ProductImg> productImgList = new ArrayList<>();
		//遍历图片一次去处理，并添加进productImg实体类里
		for (ImageHolder productImgHolder : productImgHolderList) {
			String imgAddr = ImageUtil.generateNormalImg(productImgHolder,dest);
			ProductImg productImg = new ProductImg();
			productImg.setImgAddr(imgAddr);
			productImg.setProductId(product.getProductId());
			productImg.setCreateTime(new Date());
			productImgList.add(productImg);
		}
		//如果有图片需要添加的，执行批量添加操作
		if(productImgList.size() > 0){
			try {
				int effectNum = productImgDao.batchInsertProductImg(productImgList);
				if(effectNum <= 0){
					throw new ProductOperationException("创建商品详情图失败");
				}
			} catch (Exception e) {
				throw new ProductOperationException("创建商品详情图异常："+e.getMessage());
			}
			
		}
	}
	/**
	 * 根据商品唯一id查询商品信息
	 */
	public Product getProductById(long productId) {
		return productDao.queryProductById(productId);
	}
	/**
	 * 修改商品信息
	 * 1、若缩略图参数有值，则处理缩略图
	 * 2、若原先存在缩略图，则先删除再添加新图，之后获取缩略图的路径，并赋值给product
	 * 3、若商品详情图列表参数有值，对商品详情图列表同样操作
	 * 4、将tb_product_img下面的该商品原有的所有商品详情图全部删除
	 * 5、更新tb_product的信息
	 */
	@Transactional
	public ProductExecution modifyProduct(Product product, ImageHolder thumbnail, List<ImageHolder> productImgHolderList)
			throws ProductOperationException {
		//空值判断
		if(product != null && product.getShop() != null && product.getShop().getShopId() != null){
			//给商品设置上默认属性，
			product.setLastEditTime(new Date());
			//若商品缩略图不为空，且原有缩略图不为空，则删除原有并添加新的
			if(thumbnail != null){
				//先获取一遍原有信息，（原有信息有原图片地址）
				Product tempProduct = productDao.queryProductById(product.getProductId());
				if(product.getImgAddr() != null){
					ImageUtil.deleteFileOrPath(tempProduct.getImgAddr());
				}
				addThumbnail(product, thumbnail);
			}
			//如有有新存入的商品详情图，则将原先的删除，并添加新的图片
			if(productImgHolderList != null && productImgHolderList.size() > 0){
				deleteProductImgList(product.getProductId());
				addProductImgList(product,productImgHolderList);
			}
			try {
				//更新商品信息
				int effectNum = productDao.updateProduct(product);
				if(effectNum <= 0){
					throw new ProductOperationException("更新商品信息失败");
				}
				return new ProductExecution(ProductStateEnum.SUCCESS,product);
			} catch (Exception e) {
				throw new ProductOperationException("更新商品信息异常："+e.getMessage());
			}
		}
		else{
			return new ProductExecution(ProductStateEnum.EMPTY);
		}
	}
	/**
	 * 根据商品id删除该商品下的所有商品详情图
	 * @param productId
	 */
	private void deleteProductImgList(Long productId) {
		//根据productId获取原先的图片
		List<ProductImg> productImgList = productImgDao.queryProductImgList(productId);
		//删除原来的图片
		for(ProductImg productImg : productImgList){
			ImageUtil.deleteFileOrPath(productImg.getImgAddr());//删除物理信息
		}
		//删除数据库原有图片信息
		productImgDao.deleteProductImgByProductId(productId);
	}
	/**
	 * 分页查询商品信息
	 */
	public ProductExecution getProductList(Product productCondition, int pageIndex, int pageSize) {
		//页码转换成数据库的行码，并调用dao层取回指定页码的商品列表
		int rowIndex = PageCalculator.calculatorRowIndex(pageIndex, pageSize);
		List<Product> productList = productDao.queryProductList(productCondition, rowIndex, pageSize);
		//基于同样的条件，查询返回商品列表的总数
		int count = productDao.queryProductCount(productCondition);
		ProductExecution pe = new ProductExecution();
		pe.setProductList(productList);
		pe.setCount(count);
		return pe;
	}
}
